﻿using System;
using QScheduler.Job;
using Quartz;
using Quartz.Impl;

namespace QScheduler
{
    /// <summary>
    /// 在程序中运用时，注意防止程序的回收机制对Quartz.Net的回收。（可以配合Topshelf，做Windows服务，使用方便）
    /// PS:单独做成一个程序集，为了将组件独立开；而且不同于CacheBll,这里的服务几乎只会在程序开始时调用一次，所以不用添加到BLLSession中去
    /// PS：Spring_Mvc_EF项目中无法使用此服务，因为Spring.Net使用的1.2.0的Common.Logging,
    /// 而Quartz.Net类库使用的是3.0的Common.Logging，在Global文件中，调用QuartBll时，
    /// 会默认使用当前程序（UIceng）的Common.Logging去初始化Quartz.Net类库，造成版本兼容问题。
    /// 目前没有找到Spring.Net下Common.Logging版本为3.0的，所以。。。
    /// </summary>
    public class QuartzBll
    {
        private static IScheduler scheduler;

        static QuartzBll()
        {
            //首先创建一个调度器(一个调度器可以控制多个作业)
            scheduler = StdSchedulerFactory.GetDefaultScheduler();
        }

        /// <summary>
        /// 开始所有作业
        /// </summary>
        public static bool Start()
        {
            #region 手动配置Quartz.Net（利于代码的完全独立）

            //创建出来一个具体的作业
            IJobDetail job = JobBuilder.Create<ClearUselessCacheFile>()
                .WithIdentity("job1", "jobGroup1")
                .Build();

            //创建并配置一个触发器
            DateTimeOffset startTime = DateTime.Now;
            DateTimeOffset endTime = DateTime.Now.AddYears(100);
            ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
                .WithIdentity("trigger1", "triggerGroup1")
                .StartAt(startTime)
                .EndAt(endTime)
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(900).WithRepeatCount(int.MaxValue))
                .Build();

            //加入作业调度器
            scheduler.ScheduleJob(job, trigger);

            scheduler.Start();
            return true;
            
            #endregion

            #region Topshelf调用Quartz.Net

            //HostFactory.Run(x =>//以Windows服务的形式创建一个作业（需要cmd下安装服务）
            //{
            //    x.Service<ServiceRunner>();

            //    x.SetDescription("Spring_Mvc_EF项目的windows服务");
            //    x.SetDisplayName("Spring_Mvc_EF服务");
            //    x.SetServiceName("Spring_Mvc_EF服务");

            //    x.EnablePauseAndContinue();
            //    Debug.Write("666666");
            //});

            #endregion
        }

        /// <summary>
        /// 结束所有作业
        /// </summary>
        public static bool Stop()
        {
            if (!scheduler.IsShutdown)
            {
                scheduler.Shutdown(false);
            }
            return true;
        }

        /// <summary>
        /// 暂停所有作业
        /// </summary>
        public static bool PauseAll()
        {
            scheduler.PauseAll();
            return true;
        }

        /// <summary>
        /// 继续所有作业
        /// </summary>
        public static bool ContinueAll()
        {
            scheduler.ResumeAll();
            return true;
        }
    }
}
